package com.kaifamiao.date1110;

/**
 * 1、判断类型 instanceof
 * 		JDK 16 新特性: refernece instanceof Type variable
 * 2、向下转型
 *      将父类类型的引用变量强制类型转换为子类类型
 *      
 */
public class AnimalTest2 {

	public static void main(String[] args) {
		
		Animal a = null ;
		
		a = new Birds();
		System.err.println( System.identityHashCode( a ) );
		a.eat( "红烧肉" );
		
		// reference instanceof Type : 判断 reference 指向的对象是否是 Type 类型
		if( a instanceof Birds ) {
			// 将父类类型的引用变量强制类型转换为子类类型被称作"向下转型"
			Birds b = (Birds)a ;
			System.err.println( System.identityHashCode( b ) );
			System.err.println( a == b ); // true
			// 编译时类型决定了可以访问哪些字段、调用哪些方法
			b.fly();
		}
		
		System.err.println( "~ ~ ~ ~ ~ ~ ~ ~ ~" );
		
		a = new Beast();
		System.err.println( System.identityHashCode( a ) );
		a.eat( "蜂蜜" );
		
		// JDK 16 新特性
		// ref instanceof Type variable
		if( a instanceof Beast b ) {
			System.err.println( System.identityHashCode( b ) );
			System.err.println( a == b ); // true
			b.run();
		}
		
	}

}
